from flask import Flask, request, redirect, send_from_directory
import urllib.parse
from werkzeug.utils import secure_filename
import os
import re

app = Flask(__name__)
# 设置上传文件夹路径
UPLOAD_FOLDER = '/var/www/html/Download'

# 处理中文文件名的函数
def secure_filename_with_chinese(filename):
    # 只保留字母、数字、中文和点号
    filename = re.sub(r'[^a-zA-Z0-9\u4e00-\u9fa5.]', '', filename)
    return filename

# 主页路由 - GET请求
@app.route('/')
def upload_form():
    # 获取上传文件夹中的所有文件
    files = os.listdir(UPLOAD_FOLDER)
    # 生成HTML文件列表，每个文件都有下载和删除链接
    files_html = '<br>'.join([
        f'<div style="margin: 5px 0;">'
        # 下载链接 - 对应 /download/<filename> 路由
        f'<a href="/download/{f}">{f}</a>'
        # 删除链接 - 对应 /delete/<filename> 路由
        f' <a href="/delete/{f}" style="color: red; margin-left: 10px;"'
        f' onclick="return confirm(\'确定要删除这个文件吗？\')">删除</a>'
        f'</div>' 
        for f in files
    ])
    
    # 返回HTML页面
    return f'''
    <html>
        <meta charset="UTF-8">
        <style>
            body {{ padding: 20px; font-family: Arial, sans-serif; }}
            .container {{ max-width: 800px; margin: 0 auto; }}
            .file-list {{ margin-top: 20px; }}
        </style>
    <body>
        <div class="container">
            <h2>文件上传</h2>
            <!-- 上传表单 - POST请求到 /Upload 路由 -->
            <form method="post" action="/Upload" enctype="multipart/form-data">
                <input type="file" name="file">
                <input type="submit" value="上传">
            </form>
            <div class="file-list">
                <h3>已上传文件：</h3>
                {files_html}
            </div>
        </div>
    </body>
    </html>
    '''

# 上传文件路由 - POST请求
@app.route('/Upload', methods=['POST'])
def upload_file():
    # 检查是否有文件被上传
    if 'file' not in request.files:
        return '没有选择文件'
    file = request.files['file']
    if file.filename == '':
        return '没有选择文件'
    if file:
        # 处理文件名（包括中文）
        filename = secure_filename_with_chinese(urllib.parse.unquote(file.filename))
        # 保存文件
        file.save(os.path.join(UPLOAD_FOLDER, filename))
        return '文件上传成功 <br><a href="/">返回</a>'

# 删除文件路由 - GET请求
@app.route('/delete/<filename>')
def delete_file(filename):
    try:
        file_path = os.path.join(UPLOAD_FOLDER, filename)
        if os.path.exists(file_path):
            # 删除文件
            os.remove(file_path)
            # 重定向回主页
            return redirect('/')
        return '文件不存在 <br><a href="/">返回</a>'
    except Exception as e:
        return f'删除失败：{str(e)} <br><a href="/">返回</a>'

# 下载文件路由 - GET请求
@app.route('/download/<filename>')
def download_file(filename):
    try:
        # 使用 send_from_directory 处理文件下载
        # as_attachment=True 表示作为附件下载而不是在浏览器中打开
        return send_from_directory(UPLOAD_FOLDER, filename, as_attachment=True)
    except Exception as e:
        return f'下载失败：{str(e)} <br><a href="/">返回</a>'

# 主程序入口
if __name__ == '__main__':
    # 确保上传文件夹存在
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    # 启动Flask应用
    app.run(host='0.0.0.0', port=81)
